import json
import logging
import os

from dotenv import load_dotenv
from langchain_core.output_parsers import JsonOutputParser, StrOutputParser
from langchain_core.prompts import ChatPromptTemplate
from langchain_openai import ChatOpenAI

from catalog.dip_catalog import DipCatalog
from util.read_pdf_file import ReadPdf
from util.read_txt_file import ReadTxt

logger = logging.getLogger(__name__)
#病历中提取分值记录
class AiAnalyzeMedica:
    def __init__(self):
        self.bl_knowledge = self.load_bl_knowledge()

        # 初始化AI模型
        load_dotenv()
        api_key = os.getenv("OPENAI_API_KEY")
        base_url = os.getenv("OPENAI_BASE_URL")
        model_name = os.getenv("MODEL_NAME")

        self.llm = ChatOpenAI(
            temperature=0.1,
            max_tokens=300,
            base_url=base_url,
            model=model_name,
            api_key=api_key
        )

        # 简单的年龄分析提示
        self.bl_prompt = ChatPromptTemplate.from_template(
            """你是一名资深医生，请对患者的病历进行分析。
关键分析患者主诊断和其它诊断 根据描述分析出手术名称和治疗性操作名称要和还有诊断性操作名称

病历医疗知识库：{bl_knowledge}
病历数据：{bl_data}


请返回JSON格式的结果：

{{
  患者年龄:["患者年龄"]患者年龄必须是字符串 比如18岁 尾部必须加岁
  住院天数:[数值]天
  主手术：["手术名称",如果没有返回无]
  其它手术：["手术名称",诊断性操作,治疗性操作,不包含主手术]
  主诊断:["出院诊断",取临床确认诊断第一个]
  其它诊断：["诊断名称" 不包括主诊断],
  总费用:[0]
  中医费用:[0]
}}

**重要要求**：
1. 必须返回有效的JSON格式
2. 分值必须是数值类型，不是字符串
3. 不要添加任何JSON之外的文字

返回JSON："""
        )


        self.json_parser = JsonOutputParser()
        self.bl_chain = self.bl_prompt | self.llm | self.json_parser
    # 执行中医优势病种智能体
    def call_bl_agent(self,medical_text):
        try:
            bl_pdf =medical_text;
            result = self.bl_chain.invoke({
                "bl_data": bl_pdf,
                "bl_knowledge": self.bl_knowledge
            })
            logger.info(f"AI分析患者信息结果: {result}")

            # 如果返回的是字典，直接返回；如果是字符串，尝试解析JSON
            if isinstance(result, dict):
                return result
            elif isinstance(result, str):
                try:
                    return json.loads(result)
                except json.JSONDecodeError:
                    return {"错误": "JSON解析失败", "原始结果": result}
            else:
                return {"错误": "未知返回格式", "原始结果": str(result)}

        except Exception as e:
            return {"错误": str(e)}

    def load_bl_knowledge(self):
        try:
            reader_txt = ReadTxt('病历分析知识库.txt')
            return reader_txt.load_txt_lines()
        except Exception as e:
            logger.error(f"加载病历分析知识库失败: {str(e)}")
            return ""

